"""
PaddleOCR 文档解析配置文件

包含 PaddleOCR-VL 和 Paddle 印章文本识别产线的配置
参考文档: 
- https://www.paddleocr.ai/latest/version3.x/pipeline_usage/PaddleOCR-VL.html
- https://www.paddleocr.ai/latest/version3.x/pipeline_usage/seal_recognition.html
"""

import os
from typing import Dict, Any


# --- PaddleOCR API配置 ---
PADDLE_API_CONFIG = {
    # PaddleOCR-VL 服务配置
    'ocr_vl': {
        'dev': {
            'base_url': 'http://136.110.87.133:8080',
            'endpoint': '/layout-parsing',
            'timeout': 3000,  # 超时时间（秒），文档解析可能较慢
            'max_retries': 3,  # 最大重试次数
            'retry_delay': 2,  # 重试延迟（秒）
        },
        'prod': {
            'base_url': 'http://136.110.87.133:8080',
            'endpoint': '/layout-parsing',
            'timeout': 3000,
            'max_retries': 3,
            'retry_delay': 2,
        }
    },
    
    # Paddle 印章文本识别服务配置
    'seal_recognition': {
        'dev': {
            'base_url': 'http://136.110.87.133:8081',
            'endpoint': '/seal-recognition',
            'timeout': 60,  # 印章识别较快
            'max_retries': 2,
            'retry_delay': 1,
        },
        'prod': {
            'base_url': 'http://136.110.87.133:8081',
            'endpoint': '/seal-recognition',
            'timeout': 60,
            'max_retries': 2,
            'retry_delay': 1,
        }
    }
}

# 当前环境（从环境变量读取，默认dev）
CURRENT_ENV = os.getenv('PADDLE_ENV', 'dev')


# --- PaddleOCR-VL 解析参数配置 ---
PADDLE_OCR_VL_OPTIONS = {
    # 文件类型：0=PDF，1=图像，null=自动推断
    'fileType': 0,
    
    # 文档方向分类 一般设置为true
    'useDocOrientationClassify': True, 
    
    # 文档矫正
    'useDocUnwarping': False,
    
    # 版面检测
    'useLayoutDetection': True,
    
    # 图表识别
    'useChartRecognition': True,
    
    # 版面检测阈值
    'layoutThreshold': None,
    
    # 版面NMS
    'layoutNms': True,
    
    # 版面扩展比例
    'layoutUnclipRatio': None,
    
    # 版面合并模式
    'layoutMergeBboxesMode': None,
    
    # 提示标签
    'promptLabel': None,
    
    # 格式化块内容
    'formatBlockContent': True,
    
    # 重复惩罚
    'repetitionPenalty': 1.1,
    
    # 温度参数
    'temperature': 0.2,
    
    # top_p 参数
    'topP': None,
    
    # 最小像素
    'minPixels': None,
    
    # 最大像素
    'maxPixels': None,
    
    # 美化Markdown
    'prettifyMarkdown': True,
    
    # 显示公式编号
    'showFormulaNumber': True,
    
    # 可视化结果
    'visualize': False,
}


# --- Paddle 印章识别参数配置 ---
PADDLE_SEAL_RECOGNITION_OPTIONS = {
    # 文件类型：0=PDF，1=图像，null=自动推断
    'fileType': None,
    
    # 文档方向分类
    'useDocOrientationClassify': True,
    
    # 文档矫正
    'useDocUnwarping': False,
    
    # 版面检测 - 对于纯印章图像，关闭版面检测
    'useLayoutDetection': False,
    
    # 版面检测阈值
    'layoutThreshold': None,
    
    # 版面NMS
    'layoutNms': True,
    
    # 版面扩展比例
    'layoutUnclipRatio': None,
    
    # 版面合并模式
    'layoutMergeBboxesMode': None,
    
    # 印章检测限制边长
    'sealDetLimitSideLen': None,
    
    # 印章检测限制类型
    'sealDetLimitType': None,
    
    # 印章检测阈值 - 使用与手动测试相同的参数
    'sealDetThresh': 0.2,
    
    # 印章检测框阈值 - 使用与手动测试相同的参数
    'sealDetBoxThresh': 0.6,
    
    # 印章检测扩展比例 - 使用与手动测试相同的参数
    'sealDetUnclipRatio': 0.5,
    
    # 印章识别分数阈值 - 0 表示不过滤低分结果
    'sealRecScoreThresh': 0,
    
    # 可视化结果
    'visualize': False,
}


# --- 文件类型支持配置 ---
PADDLE_SUPPORTED_FORMATS = {
    # 文档格式
    'documents': ['.pdf'],
    
    # 图片格式
    'images': ['.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.tif', '.webp'],
    
    # 最大文件大小（字节）
    'max_file_size': {
        'pdf': 100 * 1024 * 1024,      # 100MB
        'image': 100 * 1024 * 1024,    # 100MB
    }
}


# --- 错误处理配置 ---
PADDLE_ERROR_CONFIG = {
    # API错误时是否自动重试
    'auto_retry': True,
    
    # 可重试的错误状态码
    'retryable_status_codes': [408, 429, 500, 502, 503, 504],
    
    # 超时后的行为
    'timeout_behavior': 'raise',  # raise | return_none | fallback_to_mineru
    
    # 是否记录详细的错误日志
    'verbose_logging': True,
    
    # 服务故障时是否降级到 MinerU
    'fallback_to_mineru': True,
}


# --- 性能优化配置 ---
PADDLE_PERFORMANCE_CONFIG = {
    # 是否使用异步请求
    'async_enabled': True,
    
    # 批量处理时的并发数
    'max_concurrent_requests': 5,
}


# --- 印章提取配置 ---
PADDLE_SEAL_CONFIG = {
    # 是否启用印章文本提取
    'enabled': True,
    
    # 印章识别的最低置信度
    'min_confidence': 0.6,
    
    # 是否将印章文本合并到主文本中
    'merge_seal_text': True,
    
    # 印章文本的标记格式
    'seal_text_format': '【印章：{text}】',
}


# --- 调试配置 ---
PADDLE_DEBUG_CONFIG = {
    # 是否启用调试模式
    'enabled': False,
    
    # 是否保存原始API响应
    'save_raw_response': False,
    
    # 调试文件保存路径
    'debug_output_dir': 'logs/paddle_debug',
    
    # 是否打印请求和响应详情
    'verbose': False,
    
    # 是否输出 DPI 诊断信息（默认关闭，调试时开启）
    'show_dpi_diagnostics': False,
}


def get_paddle_config(env: str = None) -> Dict[str, Any]:
    """
    获取Paddle配置
    
    Args:
        env: 环境名称（dev/prod），默认使用CURRENT_ENV
        
    Returns:
        dict: Paddle配置字典
    """
    if env is None:
        env = CURRENT_ENV
    
    return {
        'api': {
            'ocr_vl': PADDLE_API_CONFIG['ocr_vl'].get(env, PADDLE_API_CONFIG['ocr_vl']['dev']),
            'seal_recognition': PADDLE_API_CONFIG['seal_recognition'].get(env, PADDLE_API_CONFIG['seal_recognition']['dev']),
        },
        'ocr_vl_options': PADDLE_OCR_VL_OPTIONS,
        'seal_recognition_options': PADDLE_SEAL_RECOGNITION_OPTIONS,
        'supported_formats': PADDLE_SUPPORTED_FORMATS,
        'seal_config': PADDLE_SEAL_CONFIG,
        'error': PADDLE_ERROR_CONFIG,
        'performance': PADDLE_PERFORMANCE_CONFIG,
        'debug': PADDLE_DEBUG_CONFIG
    }


def get_api_endpoint(service: str, env: str = None) -> str:
    """
    获取完整的API端点URL
    
    Args:
        service: 服务类型（'ocr_vl' 或 'seal_recognition'）
        env: 环境名称
        
    Returns:
        str: 完整的URL
    """
    if env is None:
        env = CURRENT_ENV
    
    if service not in PADDLE_API_CONFIG:
        raise ValueError(f"不支持的服务类型: {service}")
    
    config = PADDLE_API_CONFIG[service].get(env, PADDLE_API_CONFIG[service]['dev'])
    base_url = config['base_url']
    endpoint = config['endpoint']
    
    return f"{base_url.rstrip('/')}{endpoint}"

